import  axios  from './axios'

class Module {

  /**
   * key 的字符编码
   * @param {string} key
   */
  constructor(key) {
    this.key = key
  }

  /**
   * 编码
   */
  key = undefined;
  /**
   * 默认没有
   */
  children = undefined

  /**
   * 是否有子项
   */
  hasChild() {
    return !!this.children;
  }

  /**
   * 键值是否相等
   * @param {string} key
   */
  eq(key) {
    return this.key == key
  }

}

/**
 * 循环添加
 * @param {string} key
 * @param {Modules[]} mds
 */
const __put = (key,mds) => {
  if(mds.containsKey(key)){
    return mds.get(key)
  }else{
    const md = new Module(key)
    mds.add(md)
    return md
  }
}

class Modules {

  /**
   * 里面装的是 Module
   */
  data = []

  /**
   * 添加 如: usr-add
   * @param {string} key
   */
  addKey(key) {
    if(!key) return
    const ks = key.split('-')
    let mds = this
    for(let i = 0 ; i < ks.length ; i++){
      let md = __put(ks[i],mds)
      if(i < ks.length - 1){
          if(md.hasChild()){
            mds = md.children
          }else {
            mds = new Modules()
            md.children = mds
          }
      }
    }
  }

  /**
   * 添加到里面
   * @param {array} list
   */
  addList(list){
    if(!list) return
    for(let i in list){
      this.addKey(list[i]['key'])
    }
  }

  /**
   * 添加模块
   * @param {Module} module
   */
  add(module) {
    this.data.push(module)
  }

  /**
   * 根据 key 来获取
   * @param {string} key
   */
  get(key) {
    if (!key) return;
    for (const di of this.data) {
      if(di.eq(key))
        return di;
    }
  }

  /**
   * 是否包含 key
   * @param {string} key
   */
  containsKey(key){
    return !!this.get(key)
  }

  /**
   * 是否包含权限信息 如：user-add
   * @param {string} key
   */
  contains(key){
    if(!key) return false;
    const ks = key.split('-')
    let mds = this;
    for(let i in ks){
      if(!mds)
        return false;
      if(!mds.containsKey(ks[i])) {
        return false;
      }
      mds = mds.get(ks[i]).children;
    }
    return true;
  }

}

class Auth {

  /**
   * 所有的权限
   */
  __auth = undefined

  /**
   * 检查用户是否具有权限
   *  如：this.$auth.contains('usr-add')
   *  this.$auth.contains('usr-add','usr-edit')
   * @param {string}
   */
  contains() {
    if(!this.isLoaded()){
      console.error('还没有加载权限信息！');
      return false;
    }
    const ags = arguments
    for(let i in ags){
      if(this.__auth.contains(ags[i])){
        return true;
      }
    }
    return false
  }

  isLoaded() {
    return !!this.__auth
  }


  load(func) {
    // if (this.isLoaded()){
    //   func();
    // }
    axios.get('/api/v1/sys/auth').then(({data}) => {
      const ath = this.__auth = new Modules()
      ath.addList(data);
      func();
    })
  }


}

const auth = new Auth()

export default auth;
